package skladowisko.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import skladowisko.Armator;
import skladowisko.Kontener;
import skladowisko.ParametryFizyczne;
import skladowisko.ParametryPrzeznaczenie;
import skladowisko.dictonaries.TypKontenera;
import skladowisko.transport.TransportPrzychodzacy;
import skladowisko.transport.TransportPrzychodzacyBuilder;

/**
 *
 * @author kedziers
 */
public class TransportPCreator implements ITransportCreator {

    TransportPXlsReader reader;
    TransportPrzychodzacyBuilder builder;

    public TransportPrzychodzacy wczytajTransport(String nazwaPliku) throws Exception {
        if (nazwaPliku.endsWith(".xml")) {
            return (TransportPrzychodzacy)new XStreamTerminalCreator().wczytajTransport(nazwaPliku);
        }

        builder = new TransportPrzychodzacyBuilder();

        try {
            inicjuj(nazwaPliku);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        wczytajPociag();
        wczytajKontenery();

        return builder.getTransport();
    }

    private void inicjuj(String nazwaPliku) throws Exception {
        if (nazwaPliku.endsWith(".xls") || nazwaPliku.endsWith(".xlsx")) {
            reader = new TransportPXlsReader(nazwaPliku);
        } else {
            throw new IllegalArgumentException("nieprawidlowe rozszerzenie pliku");
        }
    }

    //**************************************************************************
    private void wczytajPociag() throws Exception {
        int licznik = 0;
        Map<String, String> mapa;

        mapa = reader.pobierzTransport();

        utworzPociag(mapa);
    }
    //**************************************************************************

    private void utworzPociag(Map<String, String> mapa) {
        DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH-mm");
        Date data;
        try {
            data = df.parse(mapa.get(TransportPXlsReader.DATA_PRZYJAZDU).trim());
        } catch (ParseException ex) {
            data = null;
            System.out.println("Blad podczas parsowania daty: " + mapa.get(TransportPXlsReader.DATA_PRZYJAZDU).trim());
        }

        builder.stworzPociag(mapa.get(TransportPXlsReader.NAZWA_POCIAGU), mapa.get(TransportPXlsReader.SKAD));
        builder.ustawPlanowanaDate(data);
    }
    //**************************************************************************

    private int wczytajKontenery() {
        int licznik = 0;
        Map<String, String> kontener;
        do {
            kontener = reader.pobierzKontener();
            Kontener nowy = null;

            if (kontener != null) {
                nowy = utworzKontener(kontener);
                // TODO wczytanie numeru wagonu i dodanie kontenera do wagonu

                int numerWagonu = (int) Double.parseDouble(kontener.get(TransportPXlsReader.WAGON));
                builder.dodajKontener(numerWagonu, nowy);
                licznik++;
            }
        } while (kontener != null);

        return licznik;
    }

    private Kontener utworzKontener(Map<String, String> mapa) {
        Kontener nowy;

        TypKontenera typ = TypKontenera.valueOf(mapa.get(TransportPXlsReader.TYP));
        ParametryFizyczne pFiz = new ParametryFizyczne(typ, (long) Double.parseDouble(mapa.get(TransportPXlsReader.MASA)));

        nowy = new Kontener(pFiz);

        nowy.setNumerRozpoznawczy(mapa.get(TransportPXlsReader.NRROZPOZNAWCZY));
        nowy.setNazwa(mapa.get(TransportPXlsReader.NAZWA));
        nowy.getpFizyczne().setTypKontenera(mapa.get(TransportPXlsReader.TYP));
        nowy.setArmator(new Armator(mapa.get(TransportPXlsReader.ARMATOR)));

        String cel = mapa.get(TransportPXlsReader.CEL_PODROZY);
        String data = mapa.get(TransportPXlsReader.GRANICZNA_DATA);
        Date dataGraniczna = null;

        if (!data.equals("nieznana")) {
            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
            try {
                dataGraniczna = df.parse(data);
            } catch (ParseException ex) {
                System.out.println("Blad podczas parsowania daty - zostanie przypisana data nieznana!");
                dataGraniczna = null;
            }
        }

        ParametryPrzeznaczenie przeznaczenie = new ParametryPrzeznaczenie(cel, dataGraniczna);
        nowy.setParametryPrzeznaczenie(przeznaczenie);

        return nowy;
    }
    //**************************************************************************
}
